package com.coszero.utilslibrary.utils

import android.app.Activity
import android.app.DownloadManager
import android.content.Context
import android.content.Intent
import android.net.Uri
import android.os.Build
import android.os.Environment
import android.os.StrictMode
import com.coszero.utils.app.AppManager
import java.io.File

/**
 * Desc： 使用系统下载
 *
 * @author xmqian
 * Email:xmqian93@163.com
 * Date: 2020/10/20 0020 15:19
 */
class SystemDownUtils(private val mContext: Context) {
    /**
     * 比较实用的升级版下载功能
     *
     * @param url 下载地址
     * @param title 文件名字
     * @param desc 文件路径
     */
    fun downloadApk(url: String?, title: String, desc: String?): Long {
        val downloadManager: DownloadManager =
            mContext.getSystemService(Context.DOWNLOAD_SERVICE) as DownloadManager
        val ID: Long

        //以下两行代码可以让下载的apk文件被直接安装而不用使用Fileprovider,系统7.0或者以上才启动。
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            val localBuilder: StrictMode.VmPolicy.Builder = StrictMode.VmPolicy.Builder()
            StrictMode.setVmPolicy(localBuilder.build())
        }

        val request: DownloadManager.Request = DownloadManager.Request(Uri.parse(url))
        // 仅允许在WIFI连接情况下下载
//        request.setAllowedNetworkTypes(Request.NETWORK_WIFI);
        // 通知栏中将出现的内容
        request.setTitle(title)
        request.setDescription(desc)

        //7.0以上的系统适配
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            request.setRequiresDeviceIdle(false)
            request.setRequiresCharging(false)
        }

        //制定下载的文件类型为APK
        request.setMimeType("application/vnd.android.package-archive")

        // 下载过程和下载完成后通知栏有通知消息。
        request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE or DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED)

        // 指定下载文件地址，使用这个指定地址可不需要WRITE_EXTERNAL_STORAGE权限。
        val externalFilesDir: File? = mContext.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS)
        request.setDestinationUri(Uri.fromFile(File(externalFilesDir!!.getAbsolutePath() + File.separator + title + ".apk")))

        //大于11版本手机允许扫描
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
            //表示允许MediaScanner扫描到这个文件，默认不允许。
            request.allowScanningByMediaScanner()
        }

        val activity: Activity? = AppManager.Companion.getAppManager().currentActivity()
        if (activity != null) {
            activity.startActivity(Intent(DownloadManager.ACTION_VIEW_DOWNLOADS)) //启动系统下载界面
        }
        ID = downloadManager.enqueue(request)
        return ID
    }

    /**
     * 下载前先移除前一个任务，防止重复下载
     *
     * @param downloadId
     */
    fun clearCurrentTask(downloadId: Long) {
        val dm: DownloadManager =
            mContext.getSystemService(Context.DOWNLOAD_SERVICE) as DownloadManager
        try {
            dm.remove(downloadId)
        } catch (ex: IllegalArgumentException) {
            ex.printStackTrace()
        }
    }
}
